
/****************************************************************************************************
**************************************************************************************************/	
 /* @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
**************************************************************************************************/	
#ifndef __LCD_H
#define __LCD_H		
//#include "sys.h"	 
#include "stdlib.h"
#include "dma.h"
#include "spi.h"

// 添加DMA和SPI相关定义
#define USE_DMA                    // 启用DMA传输
#define DMA_Min_Pixels    32       // 小数据量不使用DMA的阈值

// SPI句柄定义
#define LCD_SPI_HANDLE    hspi1    // 使用SPI1
#define TP_SPI LCD_SPI_HANDLE

// 添加硬件SPI相关定义
#define TP_SPI_HANDLE     hspi1    // 使用SPI1，与LCD共用
#define TP_SPI_TIMEOUT    1000     // SPI超时时间

// 触摸屏SPI引脚定义（与LCD共用SPI1）
// SCK: PA5, MOSI: PA7, MISO: PA6
// 控制引脚：PC0(CS), PC2(DOUT), PC3(DIN), PC10(IRQ), PC13(TCS)

// 添加DMA传输相关函数声明
void LCD_WriteData_DMA(uint8_t *data, uint16_t size);
void LCD_FillColor_DMA(uint16_t color, uint32_t pixels);
void LCD_SetDMAMode(uint8_t memInc, uint8_t size);

// 添加硬件SPI函数声明
void TP_Write_Byte_SPI(uint8_t data);
uint16_t TP_Read_AD_SPI(uint8_t CMD);


#ifndef uint8_t
#define uint8_t uint8_t
#endif

#ifndef uint16_t
#define uint16_t uint16_t
#endif

#ifndef u32
#define u32 uint32_t
#endif

//LCD重要参数集
typedef struct  
{										    
	uint16_t width;			//LCD 宽度
	uint16_t height;			//LCD 高度
	uint16_t id;				  //LCD ID
	uint8_t  dir;			  //横屏还是竖屏控制：0，竖屏；1，横屏。	
	uint16_t	 wramcmd;		//开始写gram指令
	uint16_t  setxcmd;		//设置x坐标指令
	uint16_t  setycmd;		//设置y坐标指令	 
}_lcd_dev; 	

//LCD参数
extern _lcd_dev lcddev;	//管理LCD重要参数
/////////////////////////////////////用户配置区///////////////////////////////////	 
#define USE_HORIZONTAL  	 1//定义液晶屏顺时针旋转方向 	0-0度旋转，1-90度旋转(横屏,已修正)，2-180度旋转，3-270度旋转(横屏)

//////////////////////////////////////////////////////////////////////////////////	  
//定义LCD的尺寸
#define LCD_W 320
#define LCD_H 480

//TFTLCD部分外要调用的函数		   
extern uint16_t  POINT_COLOR;//默认红色    
extern uint16_t  BACK_COLOR; //背景颜色.默认为白色

////////////////////////////////////////////////////////////////////

//-----------------LCD端口定义（适配 CubeMX 生成的引脚）---------------- 
// 注意：这些定义与 main.h 中的引脚定义对应
// TFF_CS_Pin (PC0) - LCD片选
// TFT_RESET_Pin (PC1) - LCD复位
// TFT_DC_Pin (PC2) - LCD数据/命令选择
// TP_CS_Pin (PC4) - 触摸屏片选
// TP_IRQ_Pin (PC5) - 触摸屏中断

#include "main.h"  // 引入 main.h 以使用 CubeMX 生成的引脚定义

// LCD引脚宏定义（兼容原有代码）
#define LCD_CS_GPIO_Port   TFF_CS_GPIO_Port      // PC0 - LCD片选
#define LCD_CS_Pin         TFF_CS_Pin
#define LCD_RST_GPIO_Port  TFT_RESET_GPIO_Port   // PC1 - LCD复位
#define LCD_RST_Pin        TFT_RESET_Pin
#define LCD_DC_GPIO_Port   TFT_DC_GPIO_Port      // PC2 - LCD数据/命令
#define LCD_DC_Pin         TFT_DC_Pin

// 背光控制（硬件直接上拉，不需要软件控制）
// #define LCD_LED_GPIO_Port  GPIOB
// #define LCD_LED_Pin        GPIO_PIN_9

// 使用 HAL 库的 GPIO 操作宏（替代位带操作）
#define LCD_CS_SET    HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET)
#define LCD_CS_CLR    HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET)
#define LCD_RST_SET   HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_SET)
#define LCD_RST_CLR   HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET)
#define LCD_DC_SET    HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_SET)
#define LCD_DC_CLR    HAL_GPIO_WritePin(LCD_DC_GPIO_Port, LCD_DC_Pin, GPIO_PIN_RESET)

// 兼容旧代码的宏定义（已废弃，保留用于向后兼容）
#define LCD_RS_SET    LCD_DC_SET    // 数据/命令 (DC) 
#define LCD_RS_CLR    LCD_DC_CLR

// 画笔颜色定义
#define WHITE       	0xFFFF  // 白色
#define BLACK      		0x0000  // 黑色
#define BLUE       		0x001F  // 蓝色
#define BRED        	0xF81F  // 蓝紫色
#define GRED			0xFFE0  // 黄绿色
#define GBLUE			0x07FF  // 绿色+蓝色
#define RED         	0xF800  // 红色
#define MAGENTA     	0xF81F  // 品红色
#define GREEN       	0x07E0  // 绿色
#define CYAN        	0x7FFF  // 青色
#define YELLOW      	0xFFE0  // 黄色
#define BROWN 			0xBC40  // 棕色
#define BRRED 			0xFC07  // 棕红色
#define GRAY  			0x8430  // 灰色

// GUI常用颜色
#define DARKBLUE      	 0x01CF	// 深蓝色
#define LIGHTBLUE      	 0x7D7C	// 浅蓝色  
#define GRAYBLUE       	 0x5458 // 灰蓝色（PANEL颜色）
 
#define LIGHTGREEN     		0x841F // 浅绿色
#define LIGHTGRAY     		0xEF5B // 浅灰色(PANEL)
#define LGRAY 			 	0xC618 // 浅灰色(PANEL),窗体背景色

#define LGRAYBLUE      	0xA651 // 浅灰蓝色(中间层颜色)
#define LBBLUE          0x2B12 // 浅棕蓝色(选择条目的反色)
	    															  
void LCD_Init(void);
void LCD_DisplayOn(void);
void LCD_DisplayOff(void);
void LCD_Clear(uint16_t Color);	 
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);
void LCD_DrawPoint(uint16_t x,uint16_t y);//画点
uint16_t  LCD_ReadPoint(uint16_t x,uint16_t y); //读点
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);		   
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd);

uint16_t LCD_RD_DATA(void);//读取LCD数据									    
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue);
void LCD_WR_DATA(uint8_t data);
uint16_t LCD_ReadReg(uint8_t LCD_Reg);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(uint16_t RGB_Code);
uint16_t LCD_ReadRAM(void);		   
uint16_t LCD_BGR2RGB(uint16_t c);
void LCD_SetParam(void);
void Lcd_WriteData_16Bit(uint16_t Data);
void LCD_direction(uint8_t direction );

//如果仍然觉得速度不够快，可以使用下面的宏定义,提高速度.
//注意要去掉lcd.c中void LCD_WR_DATA(uint16_t data)函数定义哦
/*
#if LCD_USE8BIT_MODEL==1//使用8位并行数据总线模式
	#define LCD_WR_DATA(data){\
	LCD_RS_SET;\
	LCD_CS_CLR;\
	DATAOUT(data);\
	LCD_WR_CLR;\
	LCD_WR_SET;\
	DATAOUT(data<<8);\
	LCD_WR_CLR;\
	LCD_WR_SET;\
	LCD_CS_SET;\
	}
	#else//使用16位并行数据总线模式
	#define LCD_WR_DATA(data){\
	LCD_RS_SET;\
	LCD_CS_CLR;\
	DATAOUT(data);\
	LCD_WR_CLR;\
	LCD_WR_SET;\
	LCD_CS_SET;\
	} 	
#endif
*/
				  		 
// 添加硬件SPI选项
#define USE_HARDWARE_SPI    // 启用硬件SPI（触摸屏和LCD共用SPI1）


#endif  
	 
	 



